/**
 * 生成一个节流函数
 * 它会将cbk的返回值转换成Promise
 * 在限制时间内或Promise unfulfilled时，不会再次触发回调
 * @param {Function} cbk 事件的回调
 * @param {number} duration 持续时间
 * @returns {Function} 返回一个异步函数
 */
export const genThrottle = (cbk, duration = 500) => {
	/** @type {number} */
	let throttleTimer;

	/** @type {boolean} */
	let isPending = false;

	return async function () {
		if (!throttleTimer && !isPending) {
			isPending = true;

			// 将回调的返回值处理成Promise形式
			Promise.resolve(cbk(...arguments)).finally(() => {
				isPending = false;
			});

			throttleTimer = setTimeout(() => {
				clearTimeout(throttleTimer);
				throttleTimer = null;
			}, duration);
		}
	};
};
